
package com.example.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.web3j.protocol.Web3j;
import org.web3j.crypto.Credentials;
import org.web3j.tx.gas.ContractGasProvider;
import com.example.contract.MyERC20;

import java.math.BigInteger;
@Service
public class TokenService {

    /**
     * 部署或已知的ERC20合约地址，通过配置文件注入
     */
    @Value("${web3j.contract.token-address}")
    private String contractAddress;

    /**
     * web3j客户端实例，用于与以太坊节点交互
     */
    @Resource
    private Web3j web3j;

    /**
     * 钱包凭证（私钥），用于签名链上交易
     */
    @Resource
    private Credentials signer; // 或者用 TransactionManager

    /**
     * 合约Gas参数提供器，便于灵活配置gasPrice/gasLimit
     */
    @Resource
    private ContractGasProvider contractGasProvider;

    /**
     * 发起ERC20 Token转账（需保证当前凭证有足够Token余额）
     * @param to 目标地址（接收方地址）
     * @param amount 转账数量（最小单位，需根据decimals换算）
     * @return 交易哈希（链上交易唯一标识）
     * @throws Exception 交易失败时抛出异常
     */
    public String transferToken(String to, BigInteger amount) throws Exception {
        MyERC20 contract = loadContract();
        return contract.transfer(to, amount).send().getTransactionHash();
    }
    
    /**
     * 加载ERC20合约实例（每次调用均重新加载，适合多合约场景）
     * @return MyERC20合约对象
     */
    public MyERC20 loadContract() {
        return MyERC20.load(contractAddress, web3j, signer, contractGasProvider);
    }

    /**
     * 查询指定地址的ERC20 Token余额
     * @param address 钱包地址
     * @return Token余额（最小单位）
     * @throws Exception 查询失败时抛出异常
     */
    public BigInteger getBalance(String address) throws Exception {
        return loadContract().balanceOf(address).send();
    }

    /**
     * 查询合约Token的symbol（如USDT、ETH）
     * @return symbol字符串
     * @throws Exception 查询失败时抛出异常
     */
    public String getSymbol() throws Exception {
        return loadContract().symbol().send();
    }

    /**
     * 查询合约Token的名称（如Tether USD）
     * @return name字符串
     * @throws Exception 查询失败时抛出异常
     */
    public String getName() throws Exception {
        return loadContract().name().send();
    }

    /**
     * 查询合约Token的精度（decimals）
     * @return decimals数值
     * @throws Exception 查询失败时抛出异常
     */
    public BigInteger getDecimals() throws Exception {
        return loadContract().decimals().send();
    }

}



